package com.lanou3g.code0514;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;


/**
 * If there are no bugs, it was created by Chen FengYao on 2018/5/14;
 * Otherwise, I don't know who created it either
 */

@WebServlet(name = "AServlet",urlPatterns = "/a")
public class AServlet extends HttpServlet {
    /*
    GET请求 和 POST请求的异同
    1. GET请求和POST请求 都是http协议规定的请求方式之一
        GET请求更偏向于从服务器获取数据,而不会修改服务器中已有的数据
        POST请求更偏向于向服务器发送数据
    2. GET请求请求参数拼接在URL后,使用?隔开
        POST请求 请求参数 放在 请求体中
        但是无论哪种方式,参数的格式和 内容 都是一样的,
            每一个参数使用key=value的形式
            多个参数之间 使用&进行连接
    3. 由于GET请求的参数是放在URL上的,又因为URL是有长度限制的
        所以,GET请求不能发送过大的数据
       而POST请求,由于是参数放入请求体,就没有长度限制了
       可以用来上传文件
    4. 关于安全,GET和POST一样 都不安全,因为 HTTP协议本身就是
    不安全的协议
     */

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 对request 和response 的操作 是不分 get/post请求的
        resp.setContentType("text/html;charset=utf-8");
        // 使用utf-8 来解析body中的参数
        req.setCharacterEncoding("utf-8");

        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String gender = req.getParameter("gender");
        // 要获取 向checkbox这种 一个name对应多个value
        // 的参数 ,需要使用该方法,返回值是 String数组
        String[] hobbies = req.getParameterValues("hobby");

        PrintWriter pw = resp.getWriter();
        pw.println("用户名:" + username);
        pw.println("密码:" + password);
        pw.println("性别:" + gender);

        pw.println("爱好:" + Arrays.toString(hobbies));

        // 获取所有请求的参数
        // enumeration 这个对象 可以"像"resultSet一样使用
        // 只有2个方法
        // hasMorElements: 是否还有没遍历的元素
        // nextElement: 下一个元素
        Enumeration<String> parameterNames
                = req.getParameterNames();

        while (parameterNames.hasMoreElements()){
            String name = parameterNames.nextElement();
            pw.println(name);
        }

        // 获取所有的参数信息,以map的形式
        // key就是参数的name
        // value 就是参数的value
        Map<String ,String[]> map
                = req.getParameterMap();

        // 获取所有的key,组成一个set 集合
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            // 为了照顾 像checkbox这样的
            // 多个value的情况,所以,value是一个数组
            String[] values = map.get(key);
            // 输出看效果
            pw.println(key + "::" + Arrays.toString(values));
        }

//        Iterator<String> iterator = keySet.iterator();
//        while (iterator.hasNext()){
//            String key = iterator.next();
//
//        }

    }
}
